#include "APP_Pool.h"

//线程列表
static pthread_t pthreads[PTHREAD_NUM];
//消息列表
static mqd_t mq;


//线程池执行函数
void* pthread_fun(void* arg)
{
    log_info("pthread_fun Start");
    while(1)
    {
        Task task = {0};
        //接收消息
        //消息队列接收消息默认采用阻塞模式接收的,所以线程池中只会有一个线程收到消息,其余线程继续阻塞等待新消息
        int ret = mq_receive(mq,(char*)&task,sizeof(Task),NULL);
        if(ret < 0)
        {
            perror("任务函数指针消息接收失败 ");
        }
        //执行提交的任务
        task.Task_fun(task.arg);
    }
    return NULL;
}

//初始化线程列表 和 消息列表
int APP_Pool_Init(void)
{
    //初始化消息队列
    mq_unlink(QUEUE_NAME);//先清除一下 消息队列
    struct mq_attr attr;
    attr.mq_maxmsg = QUEUE_LENGTH;
    attr.mq_msgsize = sizeof(Task);
    // log_info("Task空间: %ld",sizeof(Task));
    mq = mq_open(QUEUE_NAME,O_RDWR | O_CREAT,0666,&attr);
    if(mq < 0)
    {
        perror("mq消息队列创建失败 ");
        return -1;
    }
    
    //初始化线程列表
    for(int i = 0;i < PTHREAD_NUM;i++)
    {
        int r = pthread_create(&pthreads[i],NULL,pthread_fun,NULL);
        if(r < 0)
        {
            perror("线程创建失败 ");
            return -1;
        }
    }

    return 0;
}

//提交线程执行任务 即 发送消息队列信息
int APP_Pool_Submit_Task(Task* task)
{
    //通过消息队列 提交需要线程池执行的函数
    int ret = mq_send(mq,(char*)task,sizeof(Task),0);
    if(mq < 0)
    {
        perror("任务函数指针提交失败 ");
        return -1;
    }
    return 0;
}

//销毁线程池
int APP_Pool_Destroy(void)
{
    mq_close(mq);
    mq_unlink(QUEUE_NAME);
}
